﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SoftHotel.Models;

namespace SoftHotel.Controllers
{ 
    public class TrabajadorController : Controller
    {
        private TrabajadorDAO db = new TrabajadorDAO();
            
        //
        // GET: /Trabajador/

        public ViewResult Index(sTrabajador trabajador)
        {
            
            
            var trabajadores = db.Trabajadores.Include(t => t.sede).Include(t => t.pTipoDoc).Include(t => t.pEstadoCivil).Include(t => t.pSexo).Include(t => t.pDepartamento).Include(t => t.pProvincia).Include(t => t.pCargo).Include(t => t.pEstado);

            if (trabajador.horario > 0)
            {
                var q = from i in db.Trabajadores
                        join it in db.Horarios on i.idTrabajador equals it.idTrabajador
                        where trabajador.horario == it.turno
                        select i;

                trabajadores = q.Distinct().Include(t => t.sede).Include(t => t.pTipoDoc).Include(t => t.pEstadoCivil).Include(t => t.pSexo).Include(t => t.pDepartamento).Include(t => t.pProvincia).Include(t => t.pCargo).Include(t => t.pEstado);
            }

            if(trabajador.idSede > 0)
                trabajadores = trabajadores.Where(a => a.idSede == trabajador.idSede);
            if(trabajador.tipoDoc > 0)
                trabajadores = trabajadores.Where(a => a.tipoDoc == trabajador.tipoDoc);
            if (trabajador.estado > 0)
                trabajadores = trabajadores.Where(a => a.estado == trabajador.estado);
            if (trabajador.cargo > 0)
                trabajadores = trabajadores.Where(a => a.cargo == trabajador.cargo);
            if (trabajador.nombres != null)
                trabajadores = trabajadores.Where(a => a.nombres == trabajador.nombres);
            if (trabajador.apellidoPaterno != null)
                trabajadores = trabajadores.Where(a => a.apellidoPaterno == trabajador.apellidoPaterno);
            if (trabajador.apellidoMaterno != null)
                trabajadores = trabajadores.Where(a => a.apellidoMaterno == trabajador.apellidoMaterno);

            return View(trabajadores.ToList());
        }

        //
        // GET: /Trabajador/Details/5

        public ViewResult Details(int id)
        {
            var trabajadores = db.Trabajadores.Include(t => t.sede).Include(t => t.pTipoDoc).Include(t => t.pEstadoCivil).Include(t => t.pSexo).Include(t => t.pDepartamento).Include(t => t.pProvincia).Include(t => t.pCargo).Include(t => t.pEstado);
            ViewBag.trabajador = trabajadores.First(t => t.idTrabajador == id);
            var horarios = db.Horarios.Include(h => h.sede).Include(h => h.trabajador).Include(h => h.pTurno).Include(h => h.pEstado).Where(h => h.idTrabajador == id).OrderByDescending(h => h.fechaInicio);//.Include(h => h.pDia);
            
            return View(horarios);
        }

        //
        // GET: /Trabajador/Create

        public ActionResult Create()
        {
            ViewBag.idSede = new SelectList(db.Sedes, "idSede", "nombre");
            ViewBag.tipoDoc = new SelectList(db.Parametros.Where(t => t.tipo == "TIPO_DOCUMENTO_ID"), "idParametro", "valor");
            ViewBag.estadoCivil = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_CIVIL"), "idParametro", "valor");
            ViewBag.sexo = new SelectList(db.Parametros.Where(t => t.tipo == "SEXO"), "idParametro", "valor");
            ViewBag.departamento = new SelectList(db.Parametros.Where(t => t.tipo == "DEPARTAMENTO"), "idParametro", "valor");
            ViewBag.provincia = new SelectList(db.Parametros.Where(t => t.tipo == "PROVINCIA"), "idParametro", "valor");
            ViewBag.cargo = new SelectList(db.Parametros.Where(t => t.tipo == "CARGO"), "idParametro", "valor");
            ViewBag.estado = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_TRABAJADOR"), "idParametro", "valor");
            return View();
        } 

        //
        // POST: /Trabajador/Create

        [HttpPost]
        public ActionResult Create(Trabajador trabajador)
        {
            if (ModelState.IsValid)
            {
                db.Trabajadores.Add(trabajador);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.idSede = new SelectList(db.Sedes, "idSede", "nombre", trabajador.idSede);
            ViewBag.tipoDoc = new SelectList(db.Parametros.Where(t => t.tipo == "TIPO_DOCUMENTO_ID"), "idParametro", "valor", trabajador.tipoDoc);
            ViewBag.estadoCivil = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_CIVIL"), "idParametro", "valor", trabajador.estadoCivil);
            ViewBag.sexo = new SelectList(db.Parametros.Where(t => t.tipo == "SEXO"), "idParametro", "valor", trabajador.sexo);
            ViewBag.departamento = new SelectList(db.Parametros.Where(t => t.tipo == "DEPARTAMENTO"), "idParametro", "valor", trabajador.departamento);
            ViewBag.provincia = new SelectList(db.Parametros.Where(t => t.tipo == "PROVINCIA"), "idParametro", "valor", trabajador.provincia);
            ViewBag.cargo = new SelectList(db.Parametros.Where(t => t.tipo == "CARGO"), "idParametro", "valor", trabajador.cargo);
            ViewBag.estado = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_TRABAJADOR"), "idParametro", "valor", trabajador.estado);
            return View(trabajador);
        }
        
        //
        // GET: /Trabajador/Edit/5
 
        public ActionResult Edit(int id)
        {
            Trabajador trabajador = db.Trabajadores.Find(id);
            ViewBag.idSede = new SelectList(db.Sedes, "idSede", "nombre", trabajador.idSede);
            ViewBag.tipoDoc = new SelectList(db.Parametros.Where(t => t.tipo == "TIPO_DOCUMENTO_ID"), "idParametro", "valor", trabajador.tipoDoc);
            ViewBag.estadoCivil = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_CIVIL"), "idParametro", "valor", trabajador.estadoCivil);
            ViewBag.sexo = new SelectList(db.Parametros.Where(t => t.tipo == "SEXO"), "idParametro", "valor", trabajador.sexo);
            ViewBag.departamento = new SelectList(db.Parametros.Where(t => t.tipo == "DEPARTAMENTO"), "idParametro", "valor", trabajador.departamento);
            ViewBag.provincia = new SelectList(db.Parametros.Where(t => t.tipo == "PROVINCIA"), "idParametro", "valor", trabajador.provincia);
            ViewBag.cargo = new SelectList(db.Parametros.Where(t => t.tipo == "CARGO"), "idParametro", "valor", trabajador.cargo);
            ViewBag.estado = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_TRABAJADOR"), "idParametro", "valor", trabajador.estado);
            return View(trabajador);
        }

        //
        // POST: /Trabajador/Edit/5

        [HttpPost]
        public ActionResult Edit(Trabajador trabajador)
        {
            if (ModelState.IsValid)
            {
                db.Entry(trabajador).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.idSede = new SelectList(db.Sedes, "idSede", "nombre", trabajador.idSede);
            ViewBag.tipoDoc = new SelectList(db.Parametros.Where(t => t.tipo == "TIPO_DOCUMENTO_ID"), "idParametro", "valor", trabajador.tipoDoc);
            ViewBag.estadoCivil = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_CIVIL"), "idParametro", "valor", trabajador.estadoCivil);
            ViewBag.sexo = new SelectList(db.Parametros.Where(t => t.tipo == "SEXO"), "idParametro", "valor", trabajador.sexo);
            ViewBag.departamento = new SelectList(db.Parametros.Where(t => t.tipo == "DEPARTAMENTO"), "idParametro", "valor", trabajador.departamento);
            ViewBag.provincia = new SelectList(db.Parametros.Where(t => t.tipo == "PROVINCIA"), "idParametro", "valor", trabajador.provincia);
            ViewBag.cargo = new SelectList(db.Parametros.Where(t => t.tipo == "CARGO"), "idParametro", "valor", trabajador.cargo);
            ViewBag.estado = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_TRABAJADOR"), "idParametro", "valor", trabajador.estado);
            return View(trabajador);
        }

        //
        // GET: /Trabajador/Delete/5
 
        public ActionResult Delete(int id)
        {
            Trabajador trabajador = db.Trabajadores.Find(id);
            return View(trabajador);
        }

        //
        // POST: /Trabajador/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Trabajador trabajador = db.Trabajadores.Find(id);
            db.Trabajadores.Remove(trabajador);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        //
        // GET: /Trabajador/HorarioIndex

        public ViewResult HorarioIndex()
        {
            var horarios = db.Horarios.Include(h => h.sede).Include(h => h.trabajador).Include(h => h.pTurno).Include(h => h.pEstado);
            return View(horarios.ToList());
        }

        //
        // GET: /Trabajador/AddHorario

        public ActionResult AddHorario(int idT, int idS)
        {
            ViewBag.idSede = new SelectList(db.Sedes.Where(s => s.idSede == idS), "idSede", "nombre");
            ViewBag.idTrabajador = new SelectList(db.Trabajadores.Include("pTipoDoc").Where(t => t.idTrabajador == idT), "idTrabajador", "nombreCompleto");
            ViewBag.turno = new SelectList(db.Parametros.Where(h => h.tipo == "TURNO"), "idParametro", "valor");
            ViewBag.dia = new SelectList(db.Parametros.Where(h => h.tipo == "DIA"), "idParametro", "valor");
            ViewBag.estado = new SelectList(db.Parametros.Where(h => h.tipo == "ESTADO_HORARIO" && h.valor == "Activo"), "idParametro", "valor");
            ViewBag.idT = idT;
            return View();
        }

        //
        // POST: /Trabajador/AddHorario

        [HttpPost]
        public ActionResult AddHorario(Horario horario)
        {
            if (ModelState.IsValid)
            {
                db.Horarios.Add(horario);
                db.SaveChanges();
                return RedirectToAction("Details/"+horario.idTrabajador);
            }
            int idS = horario.idSede;
            int idT = horario.idTrabajador;
            ViewBag.idSede = new SelectList(db.Sedes.Where(s => s.idSede == idS), "idSede", "nombre");
            ViewBag.idTrabajador = new SelectList(db.Trabajadores.Include("pTipoDoc").Where(t => t.idTrabajador == idT), "idTrabajador", "nombreCompleto");
            ViewBag.turno = new SelectList(db.Parametros.Where(h => h.tipo == "TURNO"), "idParametro", "valor");
            ViewBag.dia = new SelectList(db.Parametros.Where(h => h.tipo == "DIA"), "idParametro", "valor");
            ViewBag.estado = new SelectList(db.Parametros.Where(h => h.tipo == "ESTADO_HORARIO" && h.valor == "Activo"), "idParametro", "valor");
            ViewBag.idT = idT;

            return View(horario);
        }

        //
        // GET: /Trabajador/EditHorario

        public ActionResult EditHorario(int id)
        {
            Horario horario = db.Horarios.Find(id);
            ViewBag.idSede = new SelectList(db.Sedes.Where(s => s.idSede == horario.idSede), "idSede", "nombre", horario.idSede);
            ViewBag.idTrabajador = new SelectList(db.Trabajadores.Include("pTipoDoc").Where(t => t.idTrabajador == horario.idTrabajador), "idTrabajador", "nombreCompleto", horario.idTrabajador);
            ViewBag.turno = new SelectList(db.Parametros.Where(h => h.tipo == "TURNO"), "idParametro", "valor", horario.turno);
            ViewBag.dia = new SelectList(db.Parametros.Where(h => h.tipo == "DIA"), "idParametro", "valor", horario.dia);
            ViewBag.estado = new SelectList(db.Parametros.Where(h => h.tipo == "ESTADO_HORARIO"), "idParametro", "valor", horario.estado);
            ViewBag.idT = horario.idTrabajador;
            return View(horario);
        }

        //
        // POST: /Trabajador/EditHorario

        [HttpPost]
        public ActionResult EditHorario(Horario horario)
        {
            if (ModelState.IsValid)
            {
                db.Entry(horario).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Details/" + horario.idTrabajador);
            }

            ViewBag.idSede = new SelectList(db.Sedes.Where(s => s.idSede == horario.idSede), "idSede", "nombre", horario.idSede);
            ViewBag.idTrabajador = new SelectList(db.Trabajadores.Include("pTipoDoc").Where(t => t.idTrabajador == horario.idTrabajador), "idTrabajador", "nombreCompleto", horario.idTrabajador);
            ViewBag.turno = new SelectList(db.Parametros.Where(h => h.tipo == "TURNO"), "idParametro", "valor", horario.turno);
            ViewBag.dia = new SelectList(db.Parametros.Where(h => h.tipo == "DIA"), "idParametro", "valor", horario.dia);
            ViewBag.estado = new SelectList(db.Parametros.Where(h => h.tipo == "ESTADO_HORARIO"), "idParametro", "valor", horario.estado);
            ViewBag.idT = horario.idTrabajador;

            return View(horario);
        }

        //
        // GET: /Trabajador/SearchIndex

        public ActionResult SearchIndex()
        {
            ViewBag.idSede = new SelectList(db.Sedes, "idSede", "nombre");
            ViewBag.tipoDoc = new SelectList(db.Parametros.Where(t => t.tipo == "TIPO_DOCUMENTO_ID"), "idParametro", "valor");
            ViewBag.horario = new SelectList(db.Parametros.Where(t => t.tipo == "TURNO"), "idParametro", "valor");
            ViewBag.cargo = new SelectList(db.Parametros.Where(t => t.tipo == "CARGO"), "idParametro", "valor");
            ViewBag.estado = new SelectList(db.Parametros.Where(t => t.tipo == "ESTADO_TRABAJADOR"), "idParametro", "valor");
            return View();
        }

        [HttpPost]
        public ActionResult SearchIndex(sTrabajador trabajador, string postAction)
        {
            if (postAction == "Agregar")
                return RedirectToAction("Create");

            return RedirectToAction("Index", trabajador);
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}